package wesi;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.List;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;


//import Programmcode.Main.AnimationAbbrechenSchalterListener;
//import Programmcode.Main.HauptschalterListener;
//import Programmcode.Main.ParameterAktivierenSchalterListener;

import wesi.TabDisposition.DispoThread;
import wesi.Table.ColumnGroup;
import wesi.Table.GroupableTableHeader;

//public class Main extends JFrame implements Runnable{
public class Main extends JFrame {
	
	private static final long serialVersionUID = 1L;
	
	//Belegung Liegezeitfaktor der Uebersicht halber ausgegliedert
	static Double [] ComboWert = {1.0, 1.1, 1.2, 1.3, 1.4,1.5,1.6,1.7,1.8,1.9,2.0, 2.1, 2.2, 2.3, 2.4,2.5,2.6,2.7,2.8,2.9,3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9,
		4.0, 4.1, 4.2, 4.3, 4.4,4.5,4.6,4.7,4.8,4.9,5.0, 5.1, 5.2, 5.3, 5.4,5.5,5.6,5.7,5.8,5.9,6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9,
		7.0, 7.1, 7.2, 7.3, 7.4,7.5,7.6,7.7,7.8,7.9,8.0, 8.1, 8.2, 8.3, 8.4,8.5,8.6,8.7,8.8,8.9,9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9};
	
	static Vector<Double> ZDLDiaposon = new Vector<Double>();
	/**Vector ist für Präsentationsschicht (Auswahlfelder des ComboBoxes)*/
	static Vector<Integer> EPSDiaposon = new Vector<Integer>();
	static Vector<Double> EPSDiaposonCalc = new Vector<Double>();
	
	/** <b>TRUE</b> = execute<br><b>FALSE</b> = skip */
	static boolean semaphor_ZDL_EPS = true;
	
	/**HauptFenster*/
	static JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
 
	// ab hier die einzelnen Register des Hauptfensters
	
	/**Registerkarte Disposition*/
	static JPanel card_dispo = new JPanel(); //Hauptpanel 
	static JPanel card_dispo_label = new JPanel(); //Steuerung
	static DefaultTableModel model = new DefaultTableModel(); //Tabele
	static JSplitPane split_dispo1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
	static JSplitPane split_dispo2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
	static JSplitPane split_dispo3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
	
	static Object [] data = new Object [] {"","","","","","","","","","","","","","","","","",""};
	static ArrayList<ArrayList> MaterialStamm = new ArrayList<ArrayList>();
	static ArrayList<ArrayList> Arbeitsplan = new ArrayList<ArrayList>();
	static ArrayList<ArrayList> stueckliste = new ArrayList<ArrayList>();
	

	/**Registerkarte Simulation*/
	static JPanel card_simu = new JPanel(null);
	/**Registerkarte Simulation - unten*/
	static JTabbedPane tabbedPaneSimu = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
	
	/**Registerkarte Auftragsliste*/
	static JScrollPane card_aliste = new JScrollPane(null);
	static JTable JTableAuftragsdatei = new JTable(new Auftragsdatei.AuftragstabelleKomplett());
	
	/** Registerkarte Auftragsdetails (Auftragsdatei Tabelle) ist in Registerkarte(JScrollPane) Auftragsliste enthalten*/ 
	static JTable card_adetails = new JTable(new Auftragsdatei.AuftragstabelleKomplett());
	
	/**Registerkarte Durchlaufdiogramme*/
	static JPanel card_diag = new JPanel(null);                 
	
	static JLabel lblAuftragsVorschau = new JLabel();
	static JButton JButtonAuftragsDetails = new JButton(""); 
	
	/** JLabel Informationen und Steuerung - Simulation*/
	JLabel KontrollLable = new JLabel();
	static JLabel JLUhrzeit = new JLabel(); // JLabel fuer das Datum
	static JLabel JLNaechsterPeriodenWechsel = new JLabel(); // JLabel fuer naechsten Periodenwechsel
	static JLabel JLTerminschranke2 = new JLabel(); // Jlabel fuer Terminschranke
	
	static JButton JButtonHauptschalter = new JButton();
	static JButton JButtonAnimationAbbrechen = new JButton("Animation abbrechen");
	static JButton JButtonZurDisposition = new JButton();
	  

	/** JLabel Umgebungsparameter (Einfache Parameter)*/
	JLabel ParameterLable = new JLabel();
	static JComboBox JCBPeriodenLaenge = new JComboBox(new String[]{"2", "3", "4", "5", "6", "7", "8", "9", "10"});
	static JComboBox JCBTerminschranke = new JComboBox(new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"});
	static JComboBox<Double> JCBDurchlaufZeitAVG = new JComboBox<Double>(ZDLDiaposon);
	
	static JComboBox<Integer> JCBEinlastungsprozentsatz = new JComboBox<Integer>(EPSDiaposon);
	
	static JComboBox JCBReihenfolgeregel = new JComboBox(new String[]{"Schlupf", "FIFO", "LOZ", "KOZ"});
	static JComboBox JCBAnzahlFahrzeuge = new JComboBox(new String[]{"0", "1", "2", "4"});
	static JButton JButtonParameterAktivieren = new JButton();

	/** JLabel Erweiterte Parameter*/
	JLabel Parameter2Lable = new JLabel ();
	
	static JComboBox JCBPauschalanteil = new JComboBox(new String []{"1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "3.0" });
	static JComboBox JCBLiegezeitfaktor = new JComboBox(ComboWert);
	static JComboBox JCBSicherheitszeitfaktor = new JComboBox(new String []{"1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "3.0" });	
	
	/** JLabel Legende - erscheint fuer Registerkarte Durchlaufterminierung*/
	JLabel LegendeLable = new JLabel ();	
	static JLabel JLLSicherheitsZeit = new JLabel();
	static JLabel JLLDurchfuehrungszeit = new JLabel();	
	static JLabel JLLLiegezeit = new JLabel();
	static JLabel JLLPauschalanteil = new JLabel();

//Elemente für die Disposition
    
	static int horizont = 2;
	static int aktuelleWoche = 130;
    static int Sleeptime = 150; //TEST 250 original
    static double sleepalt = 1.0;
    final JButton buttonStart = new JButton("Starten");
    static JButton buttonSchnelldurchlauf = new JButton("Schnelldurchlauf");
    static JButton buttonSpeedUp = new JButton("+");
    static JButton buttonSlowDown = new JButton ("-");
    static JButton buttonNaechste = new JButton("nächste Woche");
    static JButton buttonPause = new JButton ("Pause");
    static JButton buttonZurSimulation = new JButton ("zur Simulation");
    static JLabel info = new JLabel("Horizont: ");
    static JTextField eingabe = new JTextField("10" ,2);
    final JLabel speed = new JLabel (sleepalt + " x Geschw.");
    static boolean rast = false;
	static int dispoZaehler = 0;
    
	/**Object der Klasse Fabrik*/
	static Werkstatt Werkstatt = new Werkstatt();   // initialisiere Object der Klasse Fabrik	
	
	Font font = new Font("Dialog.bold", Font.PLAIN, 8);

	// ScrollPanes fuer tabbedPaneSimu (Registerkarten unterer Panel)
	static JScrollPane JScrollPaneNeueAuftraege = new JScrollPane(null);
	static JScrollPane JScrollPaneDurchlaufTerminierung = new JScrollPane(null);
	static JScrollPane JScrollPaneMaschinenAuswertungLetztePeriode = new JScrollPane();
	
	static JScrollPane JScrollPaneMaschinenAuswertungGesamtzeit = new JScrollPane(null);
	static JScrollPane JScrollPaneMaschinenAuswertungLetztePeriodeGrafik = new JScrollPane(null);
	static JScrollPane JScrollPaneMaschinenAuswertungGesamtZeitGrafik = new JScrollPane(null);
	
	static JScrollPane JScrollPaneParameterAenderung = new JScrollPane(null);
	// static JPanel jPanelPrimärBedarfsÄnderung = new JPanel(null);
	
	static JScrollPane JScrollPaneAuftragsBelastungNachTerminierung = new JScrollPane(null);
	static JScrollPane JScrollPaneAuftragsSituationNachTerminierung = new JScrollPane(null);
	static JScrollPane JScrollPaneVorhandeneWerkstattBelastung = new JScrollPane(null);
	static JScrollPane JScrollPaneAuftragsFreigabe = new JScrollPane(null); 
	static JScrollPane JScrollPaneAuftragsBelastungNachFreigabe = new JScrollPane(null); 
	static JScrollPane JScrollPaneAuftragsSituationNachFreigabe = new JScrollPane(null); 
	
	static JScrollPane JScrollPaneDFZuSZ = new JScrollPane(null);

	static int sopWoche = 0; // erste Woche ist 0, zweite ist 1 usw.
	static JPanel jPanelPrimärBedarfsÄnderung = new JPanel(null);
	static ArrayList<ArrayList> sopPrimärbedarf = new ArrayList<ArrayList>();	//ArrayList für den Inhalt der Materialstamm.xml
	/** Thread (reference to the runner thread )*/
	Thread runner;
	
	int lableHeight;
	
	/**
	 * Startmethode des Programms
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		View oberflaeche = new View();
		oberflaeche.show();
	}
}

	   